package com.example.demo;

import com.example.demo.entity.InputEntity;
import com.example.demo.entity.Item;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @ClassName DemoApplication
 * @Description
 * @Author lee
 * @Date 2022年11月03日 19:27
 */
@SpringBootApplication
public class DemoApplication {
    private static final int ROW_MAX = 20;
    private static final int DRAW_LEN_MAX = 20;
    private static final String RULE_NAME = "Name";
    private static final String RULE_VALUE = "Value";
    private static final String ORDER_ASC = "ASC";
    private static final String ORDER_DESC = "DESC";


    public static void main(String[] args) {
        // 获取输入，并对入参进行格式化
        InputEntity input = getInput();
        if (Objects.nonNull(input)) {
            // 图形化输出
            printDraw(input);
        }
    }

    private static InputEntity getInput() {
        Scanner scanner = new Scanner(System.in);
        final int count = Integer.parseInt(scanner.nextLine());
        if (count < 1 || count > ROW_MAX) {
            System.out.println("输入【数组条目数】参数错误，要求范围：1 <= n <= 20");
            return null;
        }
        String orderRuleStr = scanner.nextLine();
        String[] orderRule = orderRuleStr.split(" ");
        String rule = orderRule[0];
        if (!RULE_NAME.equals(rule) && !RULE_VALUE.equals(rule)) {
            System.out.println("输入【排序依据】参数错误，要求：Name 或 Value");
            return null;
        }
        String order = orderRule[1];
        if (!ORDER_ASC.equals(order) && !ORDER_DESC.equals(order)) {
            System.out.println("输入【排序方式】参数错误，要求：ASC 或 DESC");
            return null;
        }
        List<Item> items = new ArrayList<>();
        for (int i = 0; i < count; i++) {
            String[] row = scanner.nextLine().split(" ");
            Item item = new Item();
            item.setName(row[0]);
            int value = Integer.parseInt(row[1]);
            if (value < 0 || value > 1000000) {
                System.out.println("输入【数据value】参数错误，要求：0<=V<=1,000,000");
                return null;
            }
            item.setValue(value);
            items.add(item);
        }

        return new InputEntity(sortInputItems(rule, order, items));
    }

    /**
     * 对输入的项目根据规则排序
     *
     * @param rule  排序依据
     * @param order 排序方式
     * @param items 待排序数据
     * @return 排序后数据
     */
    private static List<Item> sortInputItems(String rule, String order, List<Item> items) {
        if (RULE_NAME.equalsIgnoreCase(rule)) {
            if (ORDER_ASC.equalsIgnoreCase(order)) {
                return items.stream().sorted(Comparator.comparingInt((Item o) -> o.getName().length())).collect(Collectors.toList());
            } else {
                return items.stream().sorted(Comparator.comparing((Item o) -> o.getName().length()).reversed()).collect(Collectors.toList());
            }
        } else {
            if (ORDER_ASC.equalsIgnoreCase(order)) {
                return items.stream().sorted(Comparator.comparing(Item::getValue)).collect(Collectors.toList());
            } else {
                return items.stream().sorted(Comparator.comparing(Item::getValue).reversed()).collect(Collectors.toList());
            }
        }
    }

    /**
     * “┌”（\u250c）  “─”（\u2500）   “┬”（\u252c）           “─”（\u2500）          “┐”（\u2510）
     * “│”（\u2502） “ ”（\u0020）文字 “│”（\u2502） “█”（\u2588）    “ ”（\u0020）    “│”（\u2502）
     * “├”（\u251c）  “─”（\u2500）   “┼”（\u253c）                                  “┤”（\u2524）
     * <p>
     * “└”（\u2514）                 “┴”（\u2534）                                  “┘”（\u2518）
     */
    private static void printDraw(InputEntity input) {
        int itemSize = input.getItems().size();
        for (int i = 0; i < itemSize * 2 + 1; i++) {
            // 首行，表格顶线
            if (i == 0) {
                System.out.print("\u250c");
                for (int j = 0; j < input.getNameLenMax(); j++) {
                    System.out.print("\u2500");
                }
                System.out.print("\u252c");
                for (int k = 0; k < DRAW_LEN_MAX; k++) {
                    System.out.print("\u2500");
                }
                System.out.println("\u2510");
            }
            // 尾行，表格底线
            else if (i == itemSize * 2) {
                System.out.print("\u2514");
                for (int j = 0; j < input.getNameLenMax(); j++) {
                    System.out.print("\u2500");
                }
                System.out.print("\u2534");
                for (int k = 0; k < DRAW_LEN_MAX; k++) {
                    System.out.print("\u2500");
                }
                System.out.println("\u2518");
            }
            // 数据行
            else if ((i + 1) % 2 == 0) {
                Item item = input.getItems().get(i / 2);
                String name = item.getName();
                int value = item.getValue();
                System.out.print("\u2502");
                for (int j = 0; j < input.getNameLenMax() - name.length(); j++) {
                    System.out.print("\u0020");
                }
                System.out.print(name + "\u2502");
                for (int k = 0; k < DRAW_LEN_MAX; k++) {
                    System.out.print(k < DRAW_LEN_MAX * value / input.getValueMax() ? "\u2588" : "\u0020");
                }
                System.out.println("\u2502");
            }
            // 表格中线行（）
            else {
                System.out.print("\u251c");
                for (int j = 0; j < input.getNameLenMax(); j++) {
                    System.out.print("\u2500");
                }
                System.out.print("\u253c");
                for (int k = 0; k < DRAW_LEN_MAX; k++) {
                    System.out.print("\u2500");
                }
                System.out.println("\u2524");
            }
        }
    }
}
